/*
 * Copyright (c) 2024-present HBIS Digital Technology Co.,Ltd. All rights reserved.
 */
package com.hbisdt.cet.sample.controller;

import com.hbisdt.cet.sample.service.ICarbonArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * 碳业务文章控制器
 *
 * @author : 教学示例
 * @version : 1.0
 * @date : 2024-12-10 13:08
 */
@RestController
public class CarbonArticleController {

    @Autowired
    private ICarbonArticleService carbonArticleService;

    // 配置文件上传目录，例如：/path/to/upload
    @Value("${file.upload-dir}")
    private String uploadDir;

    /**
     * 处理文件上传请求，将上传的文件保存到指定目录。
     *
     * @param articleId 文章ID，用于指定保存文件的目录名称。
     * @param file      上传的文件。
     * @return 返回上传结果信息，成功时返回文件名，失败时返回错误信息。
     * @author : 教学示例
     */
    @PostMapping("/carbon/upload/{articleId}")
    @ResponseBody
    public String handleFileUpload(@PathVariable String articleId, @RequestParam("file") MultipartFile file) {
        // 检查文件是否为空
        if (file.isEmpty()) {
            return "文件为空，请选择文件上传！";
        }
        try {
            // 创建上传目录（如果不存在）
            File dir = new File(uploadDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            // 保存文件
            String fileName = file.getOriginalFilename();
            File dest = new File(dir.getAbsolutePath() + File.separator + articleId);
            file.transferTo(dest);
            return "文件上传成功,原文件名:" + fileName + ",上传后的文件名:" + articleId;
        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传失败：" + e.getMessage();
        }
    }

    /**
     * 根据提供的 articleId 下载对应的文件。
     * 该函数通过 articleId 查找文件，并将文件作为资源返回给客户端。如果文件不存在，则返回 404 状态码。
     *
     * @param articleId 文件的唯一标识符，通常与文件名相同。
     * @return ResponseEntity<Resource> 包含文件资源的响应实体，如果文件不存在则返回 404 状态码。
     * @throws IOException 如果文件读取过程中发生 I/O 错误。
     * @author : 教学示例
     */
    @GetMapping("/carbon/download/{articleId}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String articleId) throws IOException {
        // 根据 articleId 查找文件（这里假设文件名与 articleId 相同）
        File file = new File(uploadDir + File.separator + articleId);
        if (!file.exists()) {
            return ResponseEntity.notFound().build();
        }
        Resource resource = new FileSystemResource(file);
        return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
                .body(resource);
    }
}
